// 管理登录用户相关数据的 vuex 子模块
import { getUserTempId, getToken, setToken, removeToken } from '@/utils/userabout'
import { reqUserRegister, reqUserLogin, reqUserInfo, reqUserLogout } from '@/api/index'

// 页面刷新或者项目重新启动,之前 state 当中所有的数据都会全部销毁并重新初始化

const state = {
  // getUserTempId() 获取临时标识 id
  userTempId: getUserTempId(),
  // 先从 localStorage 当中获取 token
  token: getToken(),
  userInfo: {}
}

const mutations = {
  RECEIVE_TOKEN (state, token) {
    state.token = token
  },
  RECEIVE_USERINFO (state, userInfo) {
    state.userInfo = userInfo
  },
  // 清空用户信息和 token
  RESET_USERINFO (state) {
    state.userInfo = {}
    state.token = ''
  }
}

const actions = {
  async reqUserRegister ({ commit }, userInfo) {
    const result = await reqUserRegister(userInfo)
    if (result.code === 200) {
      return 'ok'
    } else {
      return Promise.reject(new Error('failed'))
    }
  },
  async reqUserLogin ({ commit }, userInfo) {
    const result = await reqUserLogin(userInfo)
    if (result.code === 200) {
      commit('RECEIVE_TOKEN', result.data.token)
      // 保存到 localstorage 中做自动登录
      setToken(result.data.token)
      /*
        这里要写返回值,之前存数据没有写 return 是因为后续没有其它的不同操作
        这个需要写,因为登录不但要存储 token 数据,而且要根据登录成功还是失败决定下一步往哪跳
      */
      return 'ok'
    } else {
      return Promise.reject(new Error('failed'))
    }
  },
  // 获取用户信息
  async reqUserInfo ({ commit }) {
    const result = await reqUserInfo()
    if (result.code === 200) {
      commit('RECEIVE_USERINFO', result.data)
      return 'ok'
    } else {
      return Promise.reject(new Error('failed'))
    }
  },
  async resetUserInfo ({ commit }) {
    // 清空 localStorage 中的 token 信息
    removeToken()
    commit('RESET_USERINFO')
  },
  async reqUserLogout ({ commit }) {
    const result = await reqUserLogout()
    if (result.code === 200) {
      // 清空 localStorage 中的 token 信息
      removeToken()
      commit('RESET_USERINFO')
      return 'ok'
    } else {
      return Promise.reject(new Error('failed'))
    }
  }
}

const getters = {}

export default {
  state,
  mutations,
  actions,
  getters
}